# 策略名称: 60日均线大于120日均线选股策略
# 策略描述: 在沪深300股票中,选择60日均线大于120日均线的股票

# 导入掘金量化库
from gm.api import *
import pandas as pd
import datetime

# 设置策略参数
def init(context):
    context.short = 20                                       # 短周期均线
    context.long = 60                                        # 长周期均线
    context.period = context.long + 100   
    # 订阅沪深300股票
    context.constituent_index='SHSE.000016'
    context.constituent_stock=[]
    context.select_day = '2024-07-10'                       #选股日期
    context.frequency = '1d'
    context.fields = 'close'
    context.history_days = 120
    # 创建一个空列表来存储symbol
    context.symbol_selected=[]
    schedule(schedule_func=algo, date_rule='1d', time_rule='9:00:00')

# 策略逻辑
def algo(context):
    context.constituent_stock = get_history_constituents(index=context.constituent_index, 
                                                start_date=context.select_day, 
                                                end_date=context.select_day)[0]['constituents'].keys()
    # 订阅行情
    subscribe(symbols= context.constituent_stock, frequency='1d', count=context.period) 

def on_bar(context, bars):
    # 获取通过subscribe订阅的数据
    symbol = bars[0]['symbol']
    
    if symbol in context.constituent_stock:
        # 获取通过subscribe订阅的数据,context.data 函数用于获取市场数据。
        data =context.data(symbol=symbol, frequency='1d', count=context.period, fields='close')
        short_avg  = data['close'].rolling(context.short).mean()
        long_avg  = data['close'].rolling(context.long).mean()

        if short_avg.values[-1] >= long_avg.values[-1]:
            if symbol not in context.symbol_selected:
                context.symbol_selected.append(symbol)
                print('加入', symbol)
    symbol_selected=pd.DataFrame(context.symbol_selected)
    # 定义 CSV 文件的路径
    csv_file_path = 'output.csv'
    # 将 DataFrame 写入 CSV 文件
    symbol_selected.to_csv(csv_file_path, index=False)
    
# 获取每次回测的报告数据
def on_backtest_finished(context, indicator):
    print('回测结束。')
    print(indicator)

if __name__ == '__main__':
    '''
        strategy_id策略ID, 由系统生成
        filename文件名, 请与本文件名保持一致
        mode运行模式, 实时模式:MODE_LIVE回测模式:MODE_BACKTEST
        token绑定计算机的ID, 可在系统设置-密钥管理中生成
        backtest_start_time回测开始时间
        backtest_end_time回测结束时间
        backtest_adjust股票复权方式, 不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
        backtest_initial_cash回测初始资金
        backtest_commission_ratio回测佣金比例
        backtest_slippage_ratio回测滑点比例
        backtest_match_mode市价撮合模式，以下一tick/bar开盘价撮合:0，以当前tick/bar收盘价撮合：1
        '''
    run(strategy_id='3f303fd6-3e4d-11ef-8dfc-3417eb91badb',
        filename='main.py',
        mode=MODE_BACKTEST,
        token='',
        backtest_start_time='2024-7-10 08:00:00',
        backtest_end_time='2024-7-10 16:00:00',
        backtest_adjust=ADJUST_PREV,
        backtest_initial_cash=10000000,
        backtest_commission_ratio=0.0001,
        backtest_slippage_ratio=0.0001,
        backtest_match_mode=1)

